package com.plian.system.service.sys.orgzation;

import com.baomidou.mybatisplus.extension.service.IService;
import com.plian.system.entity.sys.ServiceOrg;
import com.plian.system.model.ListResult;
import com.plian.system.mybatis.support.Query;
import com.plian.system.vo.sys.BaseServiceOrgRecordVO;
import com.plian.system.vo.sys.ServiceOrgVO;

import java.util.List;

public interface IServiceOrgService extends IService<ServiceOrg> {

    /**
     * 根据主表id获取树结构
     * @param baseServiceOrgId
     * @return
     */
    List<ServiceOrgVO> latestTree(Long baseServiceOrgId);

    /**
     * 新增或修改
     * @param serviceOrg
     * @return
     */
    boolean submit(ServiceOrg serviceOrg);

    /**
     * 复制其他业务组织信息
     * @param otherBaseId
     * @param id
     * @return
     */
    boolean copyOtherServiceOrg(Long otherBaseId, Long id);

    /**
     * 单个节点逻辑删除 有下级单位不能删除
     * @param serviceOrg
     * @return
     */
    boolean remove(ServiceOrg serviceOrg);

    /**
     * 获取业务树历史版本 列表
     * @param baseServiceOrgId
     * @param query
     * @return
     */
    ListResult<BaseServiceOrgRecordVO> recordList(Long baseServiceOrgId, Query query);

    /**
     * 修改生效时间和失效时间
     * @param baseServiceOrgId
     * @param baseServiceOrgRecordVO
     * @return
     */
    boolean changeEffectiveTime(Long baseServiceOrgId, BaseServiceOrgRecordVO baseServiceOrgRecordVO);

    /**
     * 根据formType和时间获取 组织列表
     * @param fromType
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getListByFormTypeAndTime(Integer fromType, String queryTime);

//    /** TODO DEL
//     * 根据formType和时间获取 组织树
//     * @param fromType
//     * @param queryTime
//     * @return
//     */
//    List<ServiceOrgVO> getTreeByFormTypeAndTime(Integer fromType, String queryTime);

    /**
     *  根据formType和时间获取 组织列表
     * @param mainVersionInitialId
     * @param fromType
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getListByFormTypeAndTime(String mainVersionInitialId, Integer fromType, String queryTime);

    /**
     * 根据formType和时间获取 组织树
     * @param mainVersionInitialId
     * @param fromType
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getTreeByFormTypeAndTime(String mainVersionInitialId, Integer fromType, String queryTime);

    /**
     * 根据时间获取 主板本组织列表
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getMainOrgListByTime(String queryTime);

    /**
     *根据时间获取 主板本组织树
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getMainOrgTreeByTime(String queryTime);

    /**
     * 根据token 时间获取 主板本组织列表
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getMainOrgListByTokenAndTime(String queryTime);

    /**
     *根据token 时间获取 主板本组织树
     * @param queryTime
     * @return
     */
    List<ServiceOrgVO> getMainOrgTreeByTokenAndTime(String queryTime);

    /**
     * 根据orgId获取所有下级
     * @param orgId
     * @return
     */
    List<ServiceOrg> getChildById(String orgId);

    /**
     * 根据orgId获取所有下级id
     * @param orgId
     * @return
     */
    List<String> getChildIdsById(String orgId);

    /**
     * 根据orgId获取所有下级
     * @param orgId
     * @return
     */
    List<ServiceOrg> getChildAndOneSelfById(String orgId);

    /**
     * 根据orgId获取所有下级
     * @param orgId
     * @return
     */
    List<String> getChildIdsAndOneSelfById(String orgId);

    /**
     * 根据initialId 获取最新版本
     * @param initialId
     * @return
     */
    ServiceOrg getLatestOrg(String initialId);

}
